#ifndef __USB_APP_REG_IF_H
#define __USB_APP_REG_IF_H

#ifdef __cplusplus
 extern "C" {
#endif
#include "cmsis_os.h"
#include "hlog_api.h"

#define USB_MAX_TX_BUF_SIZE COMP_CDC_DATA_FS_OUT_PACKET_SIZE

typedef enum
{
    USB_APPID_1=0x41,               //'A'
    USB_APPID_2,
    USB_APPID_3,
    USB_APPID_POWER,
    USB_APPID_4 = 'k',
    USB_APPID_5 = 'p',	/* system property */
    USB_APPID_6 = 'b',
    //Add other APPID berfore USB_APPID_MAX_NUM
    USB_APPID_INVAILD=0xff,
}USB_APPID_TypeDef_t;

#define HTC_USBD_APP_HLOG_ENABLE

#ifdef HTC_USBD_APP_HLOG_ENABLE
#define htc_usbd_app_emerg(fmt, ...) \
	hlog_printf(HLOG_LVL_EMERG, HLOG_TAG_USB, fmt, ##__VA_ARGS__)
#define htc_usbd_app_err(fmt, ...) \
	hlog_printf(HLOG_LVL_ERR, HLOG_TAG_USB, fmt, ##__VA_ARGS__)
#define htc_usbd_app_warning(fmt, ...) \
	hlog_printf(HLOG_LVL_WARNING, HLOG_TAG_USB, fmt, ##__VA_ARGS__)
#define htc_usbd_app_info(fmt, ...) \
	hlog_printf(HLOG_LVL_INFO, HLOG_TAG_USB, fmt, ##__VA_ARGS__)
#define htc_usbd_app_debug(fmt, ...) \
	hlog_printf(HLOG_LVL_DEBUG, HLOG_TAG_USB, fmt, ##__VA_ARGS__)
#else /* HTC_USBD_APP_HLOG_ENABLE */
#define htc_usbd_app_emerg(fmt, ...) \
	printf("[USBD_APP][EMR] :" fmt, ##__VA_ARGS__)
#define htc_usbd_app_err(fmt, ...) \
	printf("[USBD_APP][ERR] :" fmt, ##__VA_ARGS__)
#define htc_usbd_app_warning(fmt, ...) \
	printf("[USBD_APP][WARN]:" fmt, ##__VA_ARGS__)
#define htc_usbd_app_info(fmt, ...) \
	printf("[USBD_APP][INFO]:" fmt, ##__VA_ARGS__)
#define htc_usbd_app_debug(fmt, ...) \
	printf("[USBD_APP][DBG] :" fmt, ##__VA_ARGS__)
#endif /* HTC_USBD_APP_HLOG_ENABLE */


typedef  int32_t (*Notify_DataCome_func_t)(uint8_t *, uint8_t);

enum
{
    USB_TX_IDLE=0,
    USB_TX_BUSY
};

/**
* @brief  Register a App module for Rcv data.
* @param  App Module.
* @retval  0:register sucess; -1: register failed
*/
int8_t Register_USB_APP(USB_APPID_TypeDef_t appid, Notify_DataCome_func_t func);


/**
* @brief  UnRegister a App module.
* @param  App Module.
* @retval  0:unregister sucess; -1: unregister failed
*/
int8_t UnRegister_One_USB_APP(USB_APPID_TypeDef_t app_id);


/**
* @brief  Get current usb tx status.
* @retval  0:USB_TX_IDLE; 1: USB_TX_BUSY
*/
uint32_t usb_app_get_tx_status(void);
int8_t usb_app_transmit_data(uint8_t *buf, uint8_t len);
void usbd_app_handle_command(void);
int usbd_app_init(void);

#ifdef __cplusplus
}
#endif
  
#endif
